package main.leetcode.clockin.Auguest;

import java.util.Arrays;

/**
 * 130. 被围绕的区域
 *
 * <p>给定一个二维的矩阵，包含 'X' 和 'O'（字母 O）。
 *
 * <p>找到所有被 'X' 围绕的区域，并将这些区域里所有的 'O' 用 'X' 填充。
 *
 * <p>解释: 被围绕的区间不会存在于边界上，换句话说，任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上，或不与边界上的 'O' 相连的 'O' 最终都会被填充为
 * 'X'。如果两个元素在水平或垂直方向相邻，则称它们是“相连”的。
 */
public class day11 {
    public static void main(String[] args) {
        char[][] board =
                new char[][] {
                    {'X', 'X', 'X', 'X'},
                    {'X', 'O', 'O', 'X'},
                    {'X', 'X', 'O', 'X'},
                    {'X', 'O', 'X', 'X'}
                };
        new day11().solve(board);
        System.out.println(Arrays.deepToString(board));
    }

    public void solve(char[][] board) {
        if (board == null || board.length == 0 || board[0].length == 0) {
            return;
        }
        int m = board.length;
        int n = board[0].length;
        boolean[][] mark = new boolean[m][n];
        for (int i = 0; i < m; ++i) {
            if (board[i][0] == 'O') {
                dfs(board, i, 0, mark);
            }
            if (board[i][n - 1] == 'O') {
                dfs(board, i, n - 1, mark);
            }
        }
        for (int i = 0; i < n; ++i) {
            if (board[0][i] == 'O') {
                dfs(board, 0, i, mark);
            }
            if (board[m - 1][i] == 'O') {
                dfs(board, m - 1, i, mark);
            }
        }
        for (int i = 1; i < m - 1; ++i) {
            for (int j = 1; j < n - 1; ++j) {
                if (board[i][j] == 'O' && !mark[i][j]) {
                    board[i][j] = 'X';
                }
            }
        }
    }

    private void dfs(char[][] board, int i, int j, boolean[][] mark) {
        if (i < 0 || i > board.length - 1 || j < 0 || j > board[0].length - 1) {
            return;
        }
        if (mark[i][j] || board[i][j] == 'X') {
            return;
        }
        mark[i][j] = true;
        dfs(board, i - 1, j, mark);
        dfs(board, i + 1, j, mark);
        dfs(board, i, j - 1, mark);
        dfs(board, i, j + 1, mark);
    }
}
